package chess_game_5;

import java.util.Arrays;

//子类，lab 5新增五子棋模式
public class GomokuGame extends Game {
    public GomokuGame(String player1, String player2, int gameId) {
        super(player1, player2, gameId, "gomoku");
        calculateLegalMoves(); // 仿照reversi写的，这里其实没必要
        initializeBoard();
        round = 0; // 初始轮数为0
    }

    @Override
    public void initializeBoard() {
        board = new char[Chess.BOARD_SIZE][Chess.BOARD_SIZE];
        for (char[] row : board) {
            Arrays.fill(row, Chess.EMPTY);
        }
    }

    @Override
    public boolean isValidMove(int row, int col) {
        return row >= 0 && row < Chess.BOARD_SIZE &&
                col >= 0 && col < Chess.BOARD_SIZE &&
                board[row][col] == Chess.EMPTY;
    }

    @Override
    public boolean placeChess(int row, int col) {
        if (!isValidMove(row, col))
            return false;
        board[row][col] = player.isCurrentPlayer1() ? Chess.PLAYER1_SYMBOL : Chess.PLAYER2_SYMBOL;
        round++; // 轮数增加， lab 5要求的记录轮数

        // checkWin 方法在下面
        if (checkWin(row, col)) {
            return true;
        }
        player.switchPlayer();
        calculateLegalMoves();
        return true;
    }

    // 四个方向检查：水平、垂直、两条对角线 五子琪规则
    private boolean checkWin(int row, int col) {
        char target = board[row][col];
        int[][] directions = { { 0, 1 }, { 1, 0 }, { 1, 1 }, { 1, -1 } };

        for (int[] dir : directions) {
            int count = 1;
            // 正向检查
            int x = row + dir[0], y = col + dir[1];
            while (x >= 0 && x < Chess.BOARD_SIZE && y >= 0 && y < Chess.BOARD_SIZE && board[x][y] == target) {
                count++;
                x += dir[0];
                y += dir[1];
            }
            // 反向检查
            x = row - dir[0];
            y = col - dir[1];
            while (x >= 0 && x < Chess.BOARD_SIZE && y >= 0 && y < Chess.BOARD_SIZE && board[x][y] == target) {
                count++;
                x -= dir[0];
                y -= dir[1];
            }
            if (count >= 5)
                return true;
        }
        return false;
    }

    @Override
    // 棋盘是否满，玩家是否胜利
    // 这里的游戏结束判断与reversi不同，reversi是棋盘满了才结束，而五子棋是有胜利条件的
    public boolean isGameOver() {
        return isBoardFull() || checkWinAnywhere();
    }

    // 判断游戏是否结束
    private boolean checkWinAnywhere() {
        for (int i = 0; i < Chess.BOARD_SIZE; i++) {
            for (int j = 0; j < Chess.BOARD_SIZE; j++) {
                if (board[i][j] != Chess.EMPTY && checkWin(i, j)) {
                    return true;
                }
            }
        }
        return false;
    }

    private boolean isBoardFull() {
        for (char[] row : board) {
            for (char cell : row) {
                if (cell == Chess.EMPTY)
                    return false;
            }
        }
        return true;
    }

    @Override
    // reversi中为计算分数，这里作为计算轮数的方法
    public String getScoreInfo() {
        return String.valueOf(round); // 直接返回轮数数值，不添加前缀
    }

    // 其实这段代码没有什么必要，只是因为reversi中有这个方法，便顺手写了
    private void calculateLegalMoves() {
        legalMoves.clear();
        /*
         * for (int i = 0; i < Chess.BOARD_SIZE; i++) {
         * for (int j = 0; j < Chess.BOARD_SIZE; j++) {
         * if (isValidMove(i, j))
         * legalMoves.add(new int[] { i, j });
         * }
         * }
         */
    }
}